package utils

import (
  "fmt"
  "livefind/global"
  "reflect"
)

// 讲一个结构体的数据通过两个结构体的同名字段copy给另一个结构体
func StructAssign(binding interface{}, value interface{}) {
  bVal := reflect.ValueOf(binding).Elem() //获取reflect.Type类型
  vVal := reflect.ValueOf(value).Elem()   //获取reflect.Type类型
  vTypeOfT := vVal.Type()
  for i := 0; i < vVal.NumField(); i++ {
    // 在要修改的结构体中查询有数据结构体中相同属性的字段，有则修改其值
    name := vTypeOfT.Field(i).Name
    if ok := bVal.FieldByName(name).IsValid(); ok {
      if bVal.FieldByName(name).Kind() != vVal.FieldByName(name).Kind() {
        continue
      }
      bVal.FieldByName(name).Set(reflect.ValueOf(vVal.Field(i).Interface()))
    }
  }
}

// 字符串首字母小写
func LowerCase(str string) string {
  var upperStr string
  vv := []rune(str) // 后文有介绍
  for i := 0; i < len(vv); i++ {
    if i == 0 {
      if vv[i] >= 65 && vv[i] <= 90 { // 后文有介绍
        vv[i] += 32 // string的码表相差32位
        upperStr += string(vv[i])
      } else {
        global.GVA_LOG.Info(fmt.Sprintf("%s:Not begins with uppercase letter", str))
        return str
      }
    } else {
      upperStr += string(vv[i])
    }
  }
  return upperStr
}

func InArray(value interface{}, array []interface{}) bool {
  for _, v := range array {
    if value == v {
      return true
    }
  }
  return false
}
